Laboratorio 1 - Data Science 1
Karina Alejandra Valladares Díaz
Carné 18005
José Eduardo López Gómez
Carné 181045
#importamos las librerías necesarias para trabajar
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from factor_analyzer import FactorAnalyzer
from sklearn.decomposition import PCA
from sklearn import preprocessing
from pandas_profiling import *
from apyori import apriori
#Utilizar únicamente el train
data = pd.read_csv("train.csv") #usamos el Id como índice
data #mostramos la data (1460 registros con 80 variables )
data = data.drop( columns= "Id") #removemos la varaible "id"
data #vemos que se removiera con éxito
#profile = ProfileReport(data, title = "Reporte Laboratorio 1", explorative = True, correlations={"cramers": {"calculate": False}}) #generamos el Codebook, le ponemos un titulo y que sea interactivo
#profile.to_file("ReporteLab1.html") #imprimimos el HTML
data.describe() #estadística básica
data.describe
sns.heatmap(data.corr()) #mostramos la correlación entre las variables
Podemos observar que hay variables que están bastantes correlacionadas por lo que deberemos proceder a removerlas a la hora de hacer las pruebas de esfericidad de Barlett y las pruebas $\chi^2$ y la prueba del valor p. Más adelante tendremos que hacer una limpieza más profunda de los datos, para correr las pruebas y el PCA, el análisis de factores y el algoritmo apriori.
sns.pairplot(data)
def generar_id(df): #función generadora de índices
return list(range(0, len(df)))
def limpiar(df, categoria): #función que limpia los datos (numéricos) con el promedio de una categoría dada
prom = df[categoria].mean()
for i in range(0, len(df)):
if str(df[categoria][i]) == "nan" or str(df[categoria][i]) == "NAN":
df[categoria][i] = float(prom)
data_limpia = data.dropna(0, subset = ["MasVnrArea"]) #removemos estos renglones
data_limpia.describe()
data_limpia.index = generar_id(data_limpia)
limpiar(data_limpia,"LotFrontage") #limpiamos las variables que tienen los datos faltantes
limpiar(data_limpia,"GarageYrBlt")
datos_cuantitativos = data.describe().columns
datos_cuantitativos
#mostramos la data proyectada con ISOMAP
fig = plt.figure(figsize=(20,10))
ax = fig.add_subplot(151)
data.boxplot("MSSubClass")
ax.set_title("Boxplot 1")
ax = fig.add_subplot(152)
data.boxplot("LotFrontage")
plt.title('Boxplot 2')
ax = fig.add_subplot(153)
data.boxplot("LotArea")
ax.set_title("Boxplot 3")
ax = fig.add_subplot(154)
data.boxplot("OverallQual")
plt.title('Boxplot 4')
ax = fig.add_subplot(155)
data.boxplot("OverallCond")
plt.axis('tight')
plt.title('Boxplot 5')
plt.show()
Podemos que notar que hay variables que tienen una gran cantidad de datos atípicos en algunas variables, por ejemplo "LotFrontage" y "LotArea". Estos datos atípicos de alguna forma afectaran el análisis de factores y el PCA, por lo que es necesario remover dichas variables para poder obtener mejores resultados.
fig1 = plt.figure(figsize=(20,10))
for k in datos_cuantitativos:
data.hist(k, bins = 8, color = "crimson")
plt.title("Histograma variable " + str(k))
datos_pca = data[datos_cuantitativos]
datos_pca
pca_nulos = datos_pca.isnull().sum().to_frame()
pca_nulos
pca_na = datos_pca.isna().sum().to_frame()
pca_na
sns.heatmap(datos_pca.corr())
Estas variables fueron elimidas por tener un coeficiente de corelación de0, l ocual tendrá implicaciones significativas sobre el dataset a la hora de hacer las pruebas de esfericidad de Barllet, la $\chi^2$ y la prueba de KMO
data_final = datos_pca.drop(columns = ["PoolArea", "3SsnPorch", "MoSold", "ScreenPorch", "OpenPorchSF", "EnclosedPorch", "MiscVal", "BsmtFinSF2",
"WoodDeckSF", "OverallCond", "HalfBath", "YrSold", "GarageYrBlt", "YearRemodAdd", "YearBuilt", "BsmtHalfBath", "BsmtFullBath",
"LowQualFinSF", "MasVnrArea", "LotFrontage"])
data_final #mostramos la data con la que trabajeremos
data_final.dtypes
sns.heatmap(data_final.corr())
np.linalg.det(np.array(data_final.corr())) #calculamos el determinante, vemos que es pequeño
from factor_analyzer.factor_analyzer import calculate_kmo
from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
chi_square_value,p_value=calculate_bartlett_sphericity(data_final)
chi_square_value, p_value
kmo_all,kmo_model=calculate_kmo(data_final)
kmo_model
# hacemos el análisis de factores con 8 factores
fa = FactorAnalyzer(n_factors = 8, rotation="varimax")
fa.fit(data_final)
# Check Eigenvalues
ev, v = fa.get_eigenvalues()
ev
plt.scatter(range(1,data_final.shape[1]+1),ev)
plt.plot(range(1,data_final.shape[1]+1),ev)
plt.title('Resultados Análisis de Factores')
plt.xlabel('Factores')
plt.ylabel('Eigenvalores')
plt.grid()
plt.show()
fa.loadings_
fa.get_factor_variance()
factores = list(range(1, len(fa.get_factor_variance()[2]) + 1))
factores
plt.scatter(factores, fa.get_factor_variance()[2])
plt.plot(factores, fa.get_factor_variance()[2])
plt.xlabel('Número de Factores')
plt.ylabel('Varianza acumulada')
plt.grid()
print("Varianza acumulada: ", fa.get_factor_variance()[2])
data_final_norm = (data_final - data_final.mean())/data_final.std() #normalizamos la data para el PCA
pca = PCA(n_components = 9) # usamos 9 componentes
model = pca.fit_transform(data_final_norm)
pca.components_
df_pca = pd.DataFrame(pca.components_)
df_pca
componentes = list(range(1, len(pca.explained_variance_ratio_) + 1))
pca.explained_variance_ratio_
pca.explained_variance_
plt.scatter(componentes,pca.explained_variance_)
plt.plot(componentes, pca.explained_variance_)
plt.xlabel('Número de componentes' )
plt.ylabel('Varianza explicada')
plt.grid()
plt.scatter(componentes, np.cumsum(pca.explained_variance_ratio_))
plt.plot(componentes, np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('Número de componentes')
plt.ylabel('Varianza acumulada')
plt.grid()
plt.show()
data_cualitativa = data[data.columns[~data.columns.isin(datos_cuantitativos )]]
data_cualitativa
data_cualitativa.groupby("GarageQual").count()
def label_function(val):
return f'{val / 100 * len(data_cualitativa):.0f}\n{val:.0f}%'
data_cualitativa.groupby('GarageQual').size().plot(kind='pie', autopct=label_function, textprops={'fontsize': 20},
colors=['tomato', 'gold', 'skyblue', "crimson"])
data_cualitativa.groupby('Utilities').size().plot(kind='pie', autopct=label_function, textprops={'fontsize': 10},
colors=['tomato', 'gold', 'skyblue', "crimson"])
data_cualitativa.groupby('Foundation').size().plot(kind='pie', autopct=label_function, textprops={'fontsize': 10},
colors=['tomato', 'gold', 'skyblue', "crimson"])
data_cualitativa.groupby('Heating').size().plot(kind='pie', autopct=label_function, textprops={'fontsize': 10},
colors=['tomato', 'gold', 'skyblue', "crimson"])
data_cualitativa.groupby('SaleType').size().plot(kind='pie', autopct=label_function, textprops={'fontsize': 10},
colors=['tomato', 'gold', 'skyblue', "crimson"])
data_priori = data_cualitativa.drop(columns = ["GarageCond", "Fence", "PoolQC", "GarageQual", "KitchenQual", "Condition1", "LandSlope", "MiscFeature",
"FireplaceQu", "HeatingQC", "LandContour", "Alley", "Condition2", "BsmtCond", "BsmtQual", "BsmtFinType2",
"BsmtFinType1", "ExterQual", "ExterCond", "GarageFinish", "Exterior1st", "Exterior2nd", "BldgType",
"LotShape", "HouseStyle", "RoofMatl", "BsmtExposure", "MasVnrType", "GarageType", "CentralAir", "MSZoning",
"PavedDrive", "RoofStyle", "LotConfig", "Street", "Utilities", "Heating"])
data_priori
data_priori.columns
records = []
for i in range(0, len(data_priori)):
records.append([str(data_priori.values[i,j]) for j in range(0, 6)])
association_rules = apriori(records)
association_results = list(association_rules)
for i in range(0, 5):
print(association_results[5*i], "\n")
Es posible efectuar una análisis de factores con dado que las pruebas de hipótesis de chi cuadrado y el valor p lo permiten. Se pueden obtener bueno resultados.
Es posible hacer un PCA, dado que la prueba de KMO es válida, además, se obtienen buenos resultados al ahcerlo.
No es recomendable hacer reglas de asosiación porque no se obtienen buenos resultados con la data.